home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / MacApp Release 10 / MacApp Release 10 - HD Ready / Libraries / Framework / Sources / UDesignator.cp < prev    next >
Encoding:
Text File  |  1996-04-03  |  17.9 KB  |  583 lines  |  [TEXT/MPS ]

  1. //----------------------------------------------------------------------------------------
  2. // UDesignator.cp 
  3. // Copyright © 1984-96 by Apple Computer, Inc. All rights reserved.
  4. //----------------------------------------------------------------------------------------
  5.  
  6. #ifndef __UDESIGNATOR__
  7. #include "UDesignator.h"
  8. #endif
  9.  
  10. // MacApp
  11.  
  12. #ifndef __UCOREUTILITIES__
  13. #include "UCoreUtilities.h"
  14. #endif
  15.  
  16. #ifndef __UFAILURE__
  17. #include "UFailure.h"
  18. #endif
  19.  
  20. #ifndef __UGEOMETRY__
  21. #include "UGeometry.h"
  22. #endif
  23.  
  24. #ifndef __UMACAPPGLOBALS__
  25. #include "UMacAppGlobals.h"
  26. #endif
  27.  
  28. #ifndef __UMACAPPUTILITIES__
  29. #include "UMacAppUtilities.h"
  30. #endif
  31.  
  32. #ifndef __UMEMORY__
  33. #include "UMemory.h"
  34. #endif
  35.  
  36. #ifndef __USTREAM__
  37. #include "UStream.h"
  38. #endif
  39.  
  40. // Toolbox
  41.  
  42. #ifndef __AEREGISTRY__
  43. #include <AERegistry.h>
  44. #endif
  45.  
  46. //========================================================================================
  47. // CLASS TDesignator
  48. //========================================================================================
  49. #undef Inherited
  50. #define Inherited TObject
  51.  
  52. #pragma segment MADesignatorNonRes
  53. MA_DEFINE_CLASS_M2(TDesignator, Inherited, MScriptableObject);
  54.  
  55. //----------------------------------------------------------------------------------------
  56. // TDesignator: Empty constructor to satisfy the compiler.
  57. //----------------------------------------------------------------------------------------
  58. #pragma segment ConstructorRes
  59.  
  60. TDesignator::TDesignator()
  61.     : MScriptableObject(cSelection)
  62. {
  63. } // TDesignator::TDesignator
  64.  
  65. //----------------------------------------------------------------------------------------
  66. // TDesignator destructor
  67. //----------------------------------------------------------------------------------------
  68. #pragma segment MADestructorRes
  69.  
  70. TDesignator::~TDesignator()
  71. {
  72. }
  73.  
  74. //----------------------------------------------------------------------------------------
  75. // TDesignator::IDesignator: 
  76. //----------------------------------------------------------------------------------------
  77. #pragma segment MADesignatorRes
  78.  
  79. void TDesignator::IDesignator()
  80. {
  81.     this->IObject();
  82. } // TDesignator::IDesignator 
  83.  
  84. //----------------------------------------------------------------------------------------
  85. // TDesignator::GetSize: 
  86. //----------------------------------------------------------------------------------------
  87. #pragma segment MADesignatorRes
  88.  
  89. Size TDesignator::GetSize()
  90. {
  91.     // this->SubClassResponsibility();
  92.     return 0;
  93. } // TDesignator::GetSize 
  94.  
  95. //----------------------------------------------------------------------------------------
  96. // TDesignator::IsContained: 
  97. //----------------------------------------------------------------------------------------
  98. #pragma segment MADesignatorRes
  99.  
  100. ContainmentType TDesignator::IsContained(TDesignator*/* aDesignator */ )
  101. {
  102.     // this->SubclassResponsibility();
  103.     return kNotContained;
  104. } // TDesignator::IsContained 
  105.  
  106. //----------------------------------------------------------------------------------------
  107. // TDesignator::IsEmpty: 
  108. //----------------------------------------------------------------------------------------
  109. #pragma segment MADesignatorRes
  110.  
  111. Boolean TDesignator::IsEmpty()
  112. {
  113.     return this->GetSize() <= 0;                // empty if nothing designated
  114. } // TDesignator::IsEmpty 
  115.  
  116.  
  117. //========================================================================================
  118. // CLASS TLinearDesignator
  119. //========================================================================================
  120. #undef Inherited
  121. #define Inherited TDesignator
  122.  
  123. #pragma segment MADesignatorNonRes
  124. MA_DEFINE_CLASS_M1(TLinearDesignator, Inherited);
  125.  
  126. //----------------------------------------------------------------------------------------
  127. // TLinearDesignator: Empty constructor to satisfy the compiler.
  128. //----------------------------------------------------------------------------------------
  129. #pragma segment ConstructorRes
  130.  
  131. TLinearDesignator::TLinearDesignator()
  132. {
  133.     fStartPos = 0;
  134.     fEndPos = 0;
  135. } // TLinearDesignator::TLinearDesignator
  136.  
  137. //----------------------------------------------------------------------------------------
  138. // TLinearDesignator destructor
  139. //----------------------------------------------------------------------------------------
  140. #pragma segment MADestructorRes
  141.  
  142. TLinearDesignator::~TLinearDesignator()
  143. {
  144. }
  145.  
  146. //----------------------------------------------------------------------------------------
  147. // TLinearDesignator::ILinearDesignator: 
  148. //----------------------------------------------------------------------------------------
  149. #pragma segment MADesignatorRes
  150.  
  151. void TLinearDesignator::ILinearDesignator(long startPos,
  152.                                                  long endPos)
  153. {
  154.     this->IDesignator();
  155.  
  156.     fStartPos = startPos;
  157.     fEndPos = endPos;
  158. } // TLinearDesignator::ILinearDesignator 
  159.  
  160. //----------------------------------------------------------------------------------------
  161. // TLinearDesignator::GetStandardSignature: 
  162. //----------------------------------------------------------------------------------------
  163. #pragma segment MADesignatorWrite
  164.  
  165. IDType TLinearDesignator::GetStandardSignature()
  166. {
  167.     return kLinearDesignator;
  168. } // TLinearDesignator::GetStandardSignature 
  169.  
  170. //----------------------------------------------------------------------------------------
  171. // TLinearDesignator::GetSize: 
  172. //----------------------------------------------------------------------------------------
  173. #pragma segment MADesignatorNonRes
  174.  
  175. Size TLinearDesignator::GetSize()
  176. {
  177.     return (Size)(fEndPos - fStartPos);
  178. } // TLinearDesignator::GetSize 
  179.  
  180. //----------------------------------------------------------------------------------------
  181. // TLinearDesignator::ReadFrom: 
  182. //----------------------------------------------------------------------------------------
  183. #pragma segment MADesignatorRead
  184.  
  185. void TLinearDesignator::ReadFrom(TStream* aStream)
  186. {
  187.     Inherited::ReadFrom(aStream);
  188.  
  189.     fStartPos = aStream->ReadLong();
  190.     fEndPos = aStream->ReadLong();
  191. } // TLinearDesignator::ReadFrom 
  192.  
  193. //----------------------------------------------------------------------------------------
  194. // TLinearDesignator::WriteTo: 
  195. //----------------------------------------------------------------------------------------
  196. #pragma segment MADesignatorWrite
  197.  
  198. void TLinearDesignator::WriteTo(TStream* aStream)// override 
  199. {
  200.     Inherited::WriteTo(aStream);
  201.  
  202.     aStream->WriteLong(fStartPos);
  203.     aStream->WriteLong(fEndPos);
  204. } // TLinearDesignator::WriteTo 
  205.  
  206. //----------------------------------------------------------------------------------------
  207. // TLinearDesignator::IsContained: 
  208. //----------------------------------------------------------------------------------------
  209. #pragma segment MADesignatorNonRes
  210.  
  211. ContainmentType TLinearDesignator::IsContained(TDesignator* aDesignator)
  212. {
  213. #if qDebug
  214.     if (aDesignator && !aDesignator->DescendsFrom(TLinearDesignator::GetClassDescStatic()))
  215.         ProgramBreak("The containing designator for the TLinearDesignator is not of the same class");
  216. #endif
  217.  
  218.     if (aDesignator)
  219.     {
  220.         long itsStartPos;
  221.         long itsEndPos;
  222.  
  223.         itsStartPos = ((TLinearDesignator *)aDesignator)->fStartPos;
  224.         itsEndPos = ((TLinearDesignator *)aDesignator)->fEndPos;
  225.         
  226.         // Are we designating the data in the other direction?  If so switch for the test.
  227.         if (itsStartPos > itsEndPos)
  228.         {
  229.             itsStartPos = itsEndPos;
  230.             itsEndPos = ((TLinearDesignator *)aDesignator)->fStartPos;
  231.         }
  232.         
  233.         if ((fStartPos == itsStartPos) && (fEndPos == itsEndPos))
  234.             return kExactlyContained;
  235.         else if ((fStartPos <= itsStartPos) && (fEndPos >= itsEndPos))
  236.             return kFullyContained;
  237.         else if (((fStartPos <= itsStartPos) && (fEndPos >= itsStartPos)) || ((fStartPos <= itsEndPos) && (fEndPos >= itsEndPos)))
  238.             return kPartiallyContained;
  239.     }
  240.     return kNotContained;
  241. } // TLinearDesignator::IsContained 
  242.  
  243.  
  244. //========================================================================================
  245. // CLASS TVRectDesignator
  246. //========================================================================================
  247. #undef Inherited
  248. #define Inherited TDesignator
  249.  
  250. #pragma segment MADesignatorNonRes
  251. MA_DEFINE_CLASS_M1(TVRectDesignator, Inherited);
  252.  
  253. //----------------------------------------------------------------------------------------
  254. // TVRectDesignator constructor
  255. //----------------------------------------------------------------------------------------
  256. #pragma segment MADesignatorRes
  257.  
  258. TVRectDesignator::TVRectDesignator()
  259. {
  260.     fDesignation = gZeroVRect;
  261. } // TVRectDesignator::TVRectDesignator
  262.  
  263. //----------------------------------------------------------------------------------------
  264. // TVRectDesignator destructor
  265. //----------------------------------------------------------------------------------------
  266. #pragma segment MADestructorRes
  267.  
  268. TVRectDesignator::~TVRectDesignator()
  269. {
  270. }
  271.  
  272. //----------------------------------------------------------------------------------------
  273. // TVRectDesignator::IVRectDesignator: 
  274. //----------------------------------------------------------------------------------------
  275. #pragma segment MADesignatorRes
  276.  
  277. void TVRectDesignator::IVRectDesignator(const VRect& itsDesignation)
  278. {
  279.     this->IDesignator();
  280.  
  281.     fDesignation = itsDesignation;
  282. } // TVRectDesignator::IVRectDesignator 
  283.  
  284. //----------------------------------------------------------------------------------------
  285. // TVRectDesignator::GetStandardSignature: 
  286. //----------------------------------------------------------------------------------------
  287. #pragma segment MADesignatorWrite
  288.  
  289. IDType TVRectDesignator::GetStandardSignature()
  290. {
  291.     return kVRectDesignator;
  292. } // TVRectDesignator::GetStandardSignature 
  293.  
  294. //----------------------------------------------------------------------------------------
  295. // TVRectDesignator::GetSize: 
  296. //----------------------------------------------------------------------------------------
  297. #pragma segment MADesignatorNonRes
  298.  
  299. Size TVRectDesignator::GetSize()
  300. {
  301.     return (fDesignation.GetLength(vSel)) * (fDesignation.GetLength(hSel));
  302. } // TVRectDesignator::GetSize 
  303.  
  304. //----------------------------------------------------------------------------------------
  305. // TVRectDesignator::ReadFrom: 
  306. //----------------------------------------------------------------------------------------
  307. #pragma segment MADesignatorRead
  308.  
  309. void TVRectDesignator::ReadFrom(TStream* aStream)
  310. {
  311.     Inherited::ReadFrom(aStream);
  312.     
  313.     VRect itsDesignation;
  314.     aStream->ReadVRect(itsDesignation);
  315.     fDesignation = itsDesignation;
  316. } // TVRectDesignator::ReadFrom 
  317.  
  318. //----------------------------------------------------------------------------------------
  319. // TVRectDesignator::WriteTo: 
  320. //----------------------------------------------------------------------------------------
  321. #pragma segment MADesignatorWrite
  322.  
  323. void TVRectDesignator::WriteTo(TStream* aStream)// override 
  324. {
  325.     Inherited::WriteTo(aStream);
  326.  
  327.     VRect itsDesignation(fDesignation);
  328.     aStream->WriteVRect(itsDesignation);
  329. } // TVRectDesignator::WriteTo 
  330.  
  331. //----------------------------------------------------------------------------------------
  332. // TVRectDesignator::IsContained: 
  333. //----------------------------------------------------------------------------------------
  334. #pragma segment MADesignatorNonRes
  335.  
  336. ContainmentType TVRectDesignator::IsContained(TDesignator* aDesignator)
  337. {
  338. #if qDebug
  339.     if (aDesignator && !aDesignator->DescendsFrom(TVRectDesignator::GetClassDescStatic()))
  340.         ProgramBreak("The containing designator for the TVRectDesignator is not of the same class");
  341. #endif
  342.  
  343.     if (aDesignator)
  344.     {
  345.         VRect itsVRect = ((TVRectDesignator *)aDesignator)->fDesignation;
  346.         
  347.         if (fDesignation == itsVRect)
  348.             return kExactlyContained;
  349.         else
  350.         {
  351.             VRect dstRect = fDesignation & itsVRect;
  352.             if (!dstRect.Empty())
  353.                 if (dstRect == itsVRect)
  354.                     return kFullyContained;
  355.                 else
  356.                     return kPartiallyContained;
  357.         }
  358.     }
  359.     return kNotContained;
  360. } // TVRectDesignator::IsContained 
  361.  
  362.  
  363. //========================================================================================
  364. // CLASS TRegionDesignator
  365. //========================================================================================
  366. #undef Inherited
  367. #define Inherited TDesignator
  368.  
  369. #pragma segment MADesignatorNonRes
  370. MA_DEFINE_CLASS_M1(TRegionDesignator, Inherited);
  371.  
  372. //----------------------------------------------------------------------------------------
  373. // TRegionDesignator constructor
  374. //----------------------------------------------------------------------------------------
  375. #pragma segment ConstructorRes
  376.  
  377. TRegionDesignator::TRegionDesignator()
  378. {
  379.     fDesignation = NULL;
  380.     fFreeRegionOnFree = TRUE;
  381. } // TRegionDesignator::TRegionDesignator
  382.  
  383. //----------------------------------------------------------------------------------------
  384. // TRegionDesignator::IRegionDesignator: 
  385. //----------------------------------------------------------------------------------------
  386. #pragma segment MADesignatorRes
  387.  
  388. void TRegionDesignator::IRegionDesignator(RgnHandle itsDesignation,
  389.                                            Boolean freeRegionOnFree)
  390. {
  391.     this->IDesignator();
  392.  
  393.     // Either assign the designation, or create it.
  394.     if (itsDesignation)
  395.         fDesignation = itsDesignation;
  396.     else
  397.     {
  398.         FailInfo fi;
  399.         Try(fi)
  400.         {
  401.             fDesignation = MakeNewRgn();
  402.             fi.Success();
  403.         }
  404.         else    // Recover
  405.         {
  406.             this->Free();
  407.             fi.ReSignal();
  408.         }
  409.     }
  410.         
  411.     fFreeRegionOnFree = freeRegionOnFree;
  412. } // TRegionDesignator::IRegionDesignator 
  413.  
  414. //----------------------------------------------------------------------------------------
  415. // TRegionDesignator::ReadFrom: 
  416. //----------------------------------------------------------------------------------------
  417. #pragma segment MADesignatorRead
  418.  
  419. void TRegionDesignator::ReadFrom(TStream* aStream)
  420. {
  421.     Inherited::ReadFrom(aStream);
  422.  
  423.     if (!fDesignation)
  424.         fDesignation = (RgnHandle)aStream->ReadHandle();
  425.     else
  426.     {
  427.         // read the size of the handle in from the stream
  428.         Size itsSize = aStream->ReadLong();
  429.  
  430.         MAVolatileInit(SignedByte, savedState, 0);
  431.  
  432.         // increase the handle appropriately
  433.         SetPermHandleSize((Handle) fDesignation, itsSize);
  434.  
  435.         FailInfo fi;
  436.         Try(fi)
  437.         {
  438.             // lock the handle and read into it from the stream
  439.             savedState = LockHandle((Handle) fDesignation);
  440.             FailMemError();
  441.             aStream->ReadBytes(*((Handle) fDesignation), itsSize);
  442.             HSetState((Handle) fDesignation, savedState);
  443.             fi.Success();
  444.         }
  445.         else                                    // Recover
  446.         {
  447.             HSetState((Handle) fDesignation, savedState);
  448.             fi.ReSignal();
  449.         }
  450.     }
  451. } // TRegionDesignator::ReadFrom 
  452.  
  453.  
  454.  
  455. //----------------------------------------------------------------------------------------
  456. // TRegionDesignator::WriteTo: 
  457. //----------------------------------------------------------------------------------------
  458. #pragma segment MADesignatorWrite
  459.  
  460. void TRegionDesignator::WriteTo(TStream* aStream)// override 
  461. {
  462.     Inherited::WriteTo(aStream);
  463.  
  464.     aStream->WriteHandle((Handle) fDesignation);
  465. } // TRegionDesignator::WriteTo 
  466.  
  467. //----------------------------------------------------------------------------------------
  468. // TRegionDesignator::Clone: 
  469. //----------------------------------------------------------------------------------------
  470. #pragma segment MADesignatorNonRes
  471.  
  472. TObject* TRegionDesignator::Clone()        // override 
  473. {
  474.     MAVolatileInit(TRegionDesignator*, aClonedRgnDesignator, (TRegionDesignator *)Inherited::Clone());
  475.  
  476.     FailInfo fi;
  477.     Try(fi)
  478.     {
  479.         aClonedRgnDesignator->fDesignation = NULL;// so failure handler works 
  480.         aClonedRgnDesignator->fDesignation = MakeNewRgn();
  481.         CopyRgn(fDesignation, aClonedRgnDesignator->fDesignation);
  482.  
  483.         fi.Success();
  484.     }
  485.     else    // Recover
  486.     {
  487.         aClonedRgnDesignator = (TRegionDesignator *)FreeIfObject(aClonedRgnDesignator);
  488.  
  489.         fi.ReSignal();
  490.     }
  491.  
  492.     return aClonedRgnDesignator;
  493. } // TRegionDesignator::Clone 
  494.  
  495. //----------------------------------------------------------------------------------------
  496. // TRegionDesignator::GetSize: 
  497. //----------------------------------------------------------------------------------------
  498. #pragma segment MADesignatorNonRes
  499.  
  500. Size TRegionDesignator::GetSize()
  501. {
  502.     if (fDesignation)
  503.     {
  504.         if (EmptyRgn(fDesignation))
  505.             return 0;
  506.         else
  507.         {
  508.             CRect rgnBBox((*fDesignation)->rgnBBox);
  509.             return (rgnBBox.GetLength(vSel) * rgnBBox.GetLength(hSel));
  510.         }
  511.     }
  512.     else
  513.         return 0;
  514. } // TRegionDesignator::GetSize 
  515.  
  516. //----------------------------------------------------------------------------------------
  517. // TRegionDesignator::IsContained: 
  518. //----------------------------------------------------------------------------------------
  519. #pragma segment MADesignatorNonRes
  520.  
  521. ContainmentType TRegionDesignator::IsContained(TDesignator* aDesignator)
  522. {
  523. #if qDebug
  524.     if (aDesignator && !aDesignator->DescendsFrom(TRegionDesignator::GetClassDescStatic()))
  525.         ProgramBreak("The containing designator for the TRegionDesignator is not of the same class");
  526. #endif
  527.  
  528.     if (aDesignator)
  529.     {
  530.         RgnHandle itsDesignation = ((TRegionDesignator *)aDesignator)->fDesignation;
  531.         
  532.         if (EqualRgn(fDesignation, itsDesignation))
  533.             return kExactlyContained;
  534.         else
  535.         {
  536.             CTemporaryRegion rRgn;
  537.             SectRgn(fDesignation, itsDesignation, rRgn);
  538.             if (!EmptyRgn(rRgn))
  539.                 if (EqualRgn(itsDesignation, rRgn))
  540.                     return kFullyContained;
  541.                 else
  542.                     return kPartiallyContained;
  543.         }
  544.     }
  545.     return kNotContained;
  546. } // TRegionDesignator::IsContained 
  547.  
  548. //----------------------------------------------------------------------------------------
  549. // TRegionDesignator::Free: 
  550. //----------------------------------------------------------------------------------------
  551. #pragma segment MADesignatorNonRes
  552.  
  553. TRegionDesignator::~TRegionDesignator()
  554. {
  555.     if (fFreeRegionOnFree)
  556.         fDesignation = DisposeIfRgnHandle(fDesignation);
  557. } // TRegionDesignator::Free 
  558.  
  559. //----------------------------------------------------------------------------------------
  560. // TRegionDesignator::GetStandardSignature: 
  561. //----------------------------------------------------------------------------------------
  562. #pragma segment MADesignatorWrite
  563.  
  564. IDType TRegionDesignator::GetStandardSignature()
  565. {
  566.     return kRegionDesignator;
  567. } // TRegionDesignator::GetStandardSignature 
  568.  
  569. //----------------------------------------------------------------------------------------
  570. // TRegionDesignator::SetDesignationRect: 
  571. //----------------------------------------------------------------------------------------
  572. #pragma segment MADesignatorNonRes
  573.  
  574. void TRegionDesignator::SetDesignationRect(const CRect& theDesignation)
  575. {
  576.     RectRgn(fDesignation, theDesignation);
  577. } // TRegionDesignator::SetDesignationRect 
  578.  
  579. //----------------------------------------------------------------------------------------
  580. // End of UDesignator.cp
  581.  
  582. #pragma segment Inline
  583.